home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / property / main.c < prev    next >
C/C++ Source or Header  |  2004-05-10  |  14KB  |  487 lines

  1. /*-------------------------------------------------------------
  2.   main.c : TClock properties dialog
  3.   (C) Kazuto Sato 1997-2003
  4.   For the license, please read readme.txt.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcprop.h"
  10.  
  11. /* Globals */
  12.  
  13. void MyHelp(HWND hwnd, const char *title);
  14. BOOL ExecCommandString(HWND hwnd, const char* command);
  15.  
  16. HINSTANCE g_hInst;                 // instance handle
  17. char      g_mydir[MAX_PATH];       // path to this exe file
  18. BOOL      g_bIniSetting = FALSE;   // save setting to ini file?
  19. char      g_inifile[MAX_PATH];     // ini file name
  20. char      g_langfile[MAX_PATH];    // tclang.txt
  21. HFONT     g_hfontDialog = NULL;    // dialog font
  22. int       g_winver;                // Windows version flags
  23. BOOL      g_bApplyClock = FALSE;   // refresh clock
  24. BOOL      g_bApplyTaskbar = FALSE; // refresh task bar
  25. BOOL      g_bApplyStartMenu = FALSE; // refresh Start menu
  26. BOOL      g_bApplyTip = FALSE;     // refresh tooltip
  27. BOOL      g_bApplyMain = FALSE;    // refresh TClock main window
  28. HICON     g_hIconPlay, g_hIconStop;
  29.                                    // icons to use frequently
  30.  
  31. /* Statics */
  32.  
  33. static int TCPropMain(void);
  34. static void InitTCProp(void);
  35. static LRESULT CALLBACK WndProcProperty(HWND hwnd, UINT message,
  36.     WPARAM wParam, LPARAM lParam);
  37. static BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
  38. static void OnInitDialog(HWND hDlg);
  39. static void OnOK(HWND hDlg);
  40. static void OnApply(HWND hDlg);
  41. static void OnHelp(HWND hDlg);
  42. static void OnTVChanged(HWND hDlg, int nItem);
  43. static void InitTreeView(HWND hDlg);
  44.  
  45. static int m_lastTreeItem;
  46.  
  47. /* --------- Property pages -------------- */
  48.  
  49. #define MAX_PAGE      12
  50.  
  51. enum {
  52.     PAGE_COLOR, PAGE_SIZE, PAGE_FORMAT,
  53.     PAGE_ALARM, PAGE_CUCKOO,
  54.     PAGE_MOUSE, PAGE_MOUSE2,
  55.     PAGE_TOOLTIP,
  56.     /* PAGE_SNTP, */
  57.     PAGE_STARTBUTTON, PAGE_STARTMENU, PAGE_TASKBAR,
  58.     PAGE_MISC
  59. };
  60.  
  61. static struct {
  62.     HWND hDlg;
  63.     int idDlg;
  64.     DLGPROC dlgproc;
  65. } g_dlgPage[MAX_PAGE] = {
  66.   { NULL, IDD_PAGECOLOR,       PageColorProc },  /* PAGE_COLOR */
  67.   { NULL, IDD_PAGESIZE,        PageSizeProc },   /* PAGE_SIZE */
  68.   { NULL, IDD_PAGEFORMAT,      PageFormatProc }, /* PAGE_FORMAT */
  69.   { NULL, IDD_PAGEALARM,       PageAlarmProc },  /* PAGE_ALARM */
  70.   { NULL, IDD_PAGECUCKOO,      PageCuckooProc }, /* PAGE_CUCKOO */
  71.   { NULL, IDD_PAGEMOUSE,       PageMouseProc },  /* PAGE_MOUSE */
  72.   { NULL, IDD_PAGEMOUSE2,      PageMouse2Proc }, /* PAGE_MOUSE2 */
  73.   { NULL, IDD_PAGETOOLTIP,     PageTooltipProc }, /* PAGE_TOOLTIP */
  74. /*  { NULL, IDD_PAGESNTP,        PageSNTPProc }, */  /* PAGE_SNTP */
  75.   { NULL, IDD_PAGESTARTBUTTON, PageStartButtonProc }, /* PAGE_STARTBUTTON */
  76.   { NULL, IDD_PAGESTARTMENU,   PageStartMenuProc }, /* PAGE_STARTMENU */
  77.   { NULL, IDD_PAGETASKBAR,     PageTaskbarProc }, /* PAGE_TASKBAR */
  78.   { NULL, IDD_PAGEMISC,        PageMiscProc },   /* PAGE_MISC */
  79. };
  80.  
  81. /* --------- TreeView items -------------- */
  82.  
  83. #define MAX_TREEITEM 16
  84.  
  85. enum {
  86.     ITEM_PARENTCLOCK, ITEM_COLOR, ITEM_SIZE, ITEM_FORMAT,
  87.     ITEM_PARENTALARM, ITEM_ALARM, ITEM_CUCKOO,
  88.     ITEM_PARENTMOUSE, ITEM_CLICK, ITEM_MOUSEMISC,
  89.     ITEM_TOOLTIP,
  90.     /* ITEM_SNTP, */
  91.     ITEM_PARENTTASKBAR, ITEM_STARTBUTTON, ITEM_STARTMENU, ITEM_TASKBAR,
  92.     ITEM_MISC
  93. };
  94.  
  95. static struct {
  96.     int   nParent;
  97.     int   idStr;
  98.     char *entry;
  99.     int   nPage;
  100. } g_treeItem[MAX_TREEITEM] = {
  101.   
  102.   /* ITEM_PARENTCLOCK */
  103.   { -1, IDS_CLOCK,   "Clock",   PAGE_COLOR },
  104.   { ITEM_PARENTCLOCK,                               /* ITEM_COLOR */
  105.         IDS_COLOR,   "Color",   PAGE_COLOR },
  106.   { ITEM_PARENTCLOCK,                                /* ITEM_SIZE */
  107.         IDS_SIZEPOS, "SizePos", PAGE_SIZE  },
  108.   { ITEM_PARENTCLOCK,                              /* ITEM_FORMAT */
  109.         IDS_FORMAT,  "Format",  PAGE_FORMAT },
  110.   
  111.   /* ITEM_PARENTALARM */
  112.   { -1, IDS_ALARM,  "Alarm",  PAGE_ALARM },
  113.   { ITEM_PARENTALARM,                                /* ITEM_ALARM */
  114.         IDS_ALARM,  "Alarm",  PAGE_ALARM },
  115.   { ITEM_PARENTALARM,                               /* ITEM_CUCKOO */
  116.         IDS_CUCKOO, "Cuckoo", PAGE_CUCKOO },
  117.   
  118.   /* ITEM_PARENTMOUSE */
  119.   { -1, IDS_MOUSE, "Mouse", PAGE_MOUSE }, 
  120.   { ITEM_PARENTMOUSE,                                /* ITEM_CLICK */
  121.         IDS_CLICK, "Click", PAGE_MOUSE },
  122.   { ITEM_PARENTMOUSE,                            /* ITEM_MOUSEMISC */
  123.         IDS_MOUSE2, "Mouse2",  PAGE_MOUSE2 },
  124.   
  125.   /* ITEM_TOOLTIP */
  126.   { -1, IDS_TOOLTIP, "Tooltip", PAGE_TOOLTIP },
  127.   
  128.   /* ITEM_SNTP */
  129.   /* { -1, IDS_SYNC, "Sync", PAGE_SNTP }, */
  130.   
  131.   /* ITEM_PARENTTASKBAR */
  132.   { -1, IDS_TASKBAR,     "Taskbar",     PAGE_STARTBUTTON },
  133.   { ITEM_PARENTTASKBAR,                         /* ITEM_STARTBUTTON */
  134.         IDS_STARTBUTTON, "Startbutton", PAGE_STARTBUTTON },
  135.   { ITEM_PARENTTASKBAR,                         /* ITEM_STARTMENU */
  136.         IDS_STARTMENU,   "Startmenu",   PAGE_STARTMENU },
  137.   { ITEM_PARENTTASKBAR,                             /* ITEM_TASKBAR */
  138.         IDS_TASKBAR,     "Taskbar",     PAGE_TASKBAR },
  139.   
  140.   /* ITEM_MISC */
  141.   { -1, IDS_MISC, "Misc", PAGE_MISC }, 
  142. };
  143.  
  144. /*-------------------------------------------
  145.   WinMain
  146. ---------------------------------------------*/
  147. #ifdef NODEFAULTLIB
  148. void WINAPI WinMainCRTStartup(void)
  149. {
  150.     g_hInst = GetModuleHandle(NULL);
  151.     ExitProcess(TCPropMain());
  152. }
  153. #else
  154. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  155.     LPSTR lpCmdLine, int nCmdShow)
  156. {
  157.     g_hInst = hInstance;
  158.     return TCPropMain();
  159. }
  160. #endif
  161.  
  162. /*-------------------------------------------
  163.   main routine
  164. ---------------------------------------------*/
  165. int TCPropMain(void)
  166. {
  167.     WNDCLASS wndclass;
  168.     HWND hwnd;
  169.     
  170.     hwnd = FindWindow(CLASS_TCLOCKPROP, NULL);
  171.     if(hwnd != NULL)
  172.     {
  173.         SetForegroundWindow98(hwnd);
  174.         return 1;
  175.     }
  176.     
  177.     InitCommonControls();
  178.     
  179.     InitTCProp();
  180.     
  181.     // register a window class of dialog
  182.     wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  183.     wndclass.lpfnWndProc   = WndProcProperty;
  184.     wndclass.cbClsExtra    = 0;
  185.     wndclass.cbWndExtra    = DLGWINDOWEXTRA;
  186.     wndclass.hInstance     = g_hInst;
  187.     wndclass.hIcon         = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_TCLOCK));
  188.     wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  189.     wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
  190.     wndclass.lpszMenuName  = NULL;
  191.     wndclass.lpszClassName = CLASS_TCLOCKPROP;
  192.     RegisterClass(&wndclass);
  193.     
  194.     return DialogBox(g_hInst, MAKEINTRESOURCE(IDD_PROPERTY),
  195.         NULL, DlgProc);
  196. }
  197.  
  198. /*-------------------------------------------
  199.   initialize
  200. ---------------------------------------------*/
  201. void InitTCProp(void)
  202. {
  203.     GetModuleFileName(g_hInst, g_mydir, MAX_PATH);
  204.     del_title(g_mydir);
  205.     strcpy(g_inifile, g_mydir);
  206.     add_title(g_inifile, "tclock.ini");
  207.     g_bIniSetting = TRUE;
  208.     
  209.     // common/langcode.c
  210.     FindFileWithLangCode(g_langfile, GetUserDefaultLangID(), TCLANGTXT);
  211.     g_hfontDialog = CreateDialogFont();
  212.     
  213.     g_winver = CheckWinVersion();
  214.     
  215.     g_hIconPlay = LoadImage(g_hInst, MAKEINTRESOURCE(IDI_PLAY), IMAGE_ICON,
  216.         16, 16, LR_DEFAULTCOLOR|LR_SHARED);
  217.     g_hIconStop = LoadImage(g_hInst, MAKEINTRESOURCE(IDI_STOP), IMAGE_ICON,
  218.         16, 16, LR_DEFAULTCOLOR|LR_SHARED);
  219. }
  220.  
  221. /*-------------------------------------------
  222.   window procedure of CLASS_TCLOCKPROP
  223. ---------------------------------------------*/
  224. LRESULT CALLBACK WndProcProperty(HWND hwnd, UINT message,
  225.     WPARAM wParam, LPARAM lParam)
  226. {
  227.     return DefDlgProc(hwnd, message, wParam, lParam);
  228. }
  229.  
  230. /*-------------------------------------------
  231.   dialog procedure
  232. ---------------------------------------------*/
  233. BOOL CALLBACK DlgProc(HWND hDlg, UINT message,
  234.     WPARAM wParam, LPARAM lParam)
  235.  
  236. {
  237.     switch(message)
  238.     {
  239.         case WM_INITDIALOG:
  240.             OnInitDialog(hDlg);
  241.             return TRUE;
  242.         case WM_COMMAND:
  243.         {
  244.             WORD id; // , code;
  245.             id = LOWORD(wParam); // code = HIWORD(wParam);
  246.             switch(id)
  247.             {
  248.                 case IDC_APPLY:
  249.                     OnApply(hDlg);
  250.                     break;
  251.                 case IDC_MYHELP:
  252.                     OnHelp(hDlg);
  253.                     break;
  254.                 case IDOK:
  255.                     OnOK(hDlg);
  256.                 case IDCANCEL:
  257.                     if(g_hfontDialog)
  258.                         DeleteObject(g_hfontDialog);
  259.                     SetMyRegLong(NULL, "LastTreeItem", m_lastTreeItem);
  260.                     EndDialog(hDlg, LOWORD(wParam));
  261.                     break;
  262.             }
  263.             return TRUE;
  264.         }
  265.         case WM_NOTIFY:
  266.         {
  267.             NM_TREEVIEW* pNMTV = (NM_TREEVIEW *)lParam;
  268.             if(pNMTV->hdr.code == TVN_SELCHANGED)
  269.             {
  270.                 OnTVChanged(hDlg, pNMTV->itemNew.lParam);
  271.                 return TRUE;
  272.             }
  273.             break;
  274.         }
  275.         case PSM_CHANGED:
  276.             EnableDlgItem(hDlg, IDC_APPLY, TRUE);
  277.             return TRUE;
  278.     }
  279.     return FALSE;
  280. }
  281.  
  282. /*-------------------------------------------
  283.   initialize main dialog
  284. ---------------------------------------------*/
  285. void OnInitDialog(HWND hDlg)
  286. {
  287.     // common/tclang.c
  288.     SetDialogLanguage(hDlg, "Property", g_hfontDialog);
  289.     
  290.     // hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_TCLOCK));
  291.     // SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
  292.     
  293.     SetMyDialgPos(hDlg, 32, 32);
  294.     
  295.     InitTreeView(hDlg);
  296. }
  297.  
  298. /*-------------------------------------------
  299.   "OK" button
  300. ---------------------------------------------*/
  301. void OnOK(HWND hDlg)
  302. {
  303.     OnApply(hDlg);
  304. }
  305.  
  306. /*-------------------------------------------
  307.   "Apply" button
  308. ---------------------------------------------*/
  309. void OnApply(HWND hDlg)
  310. {
  311.     HWND hwndClock;
  312.     NMHDR lp;
  313.     int i;
  314.     
  315.     hwndClock = GetClockWindow();
  316.     
  317.     lp.code = PSN_APPLY;
  318.     for(i = 0; i < MAX_PAGE; i++)
  319.     {
  320.         if(g_dlgPage[i].hDlg)
  321.             SendMessage(g_dlgPage[i].hDlg, WM_NOTIFY, 0, (LPARAM)&lp);
  322.     }
  323.     
  324.     if(hwndClock)
  325.     {
  326.         if(g_bApplyClock)
  327.             PostMessage(hwndClock, CLOCKM_REFRESHCLOCK, 0, 0);
  328.         if(g_bApplyTaskbar)
  329.             PostMessage(hwndClock, CLOCKM_REFRESHTASKBAR, 0, 0);
  330.         if(g_bApplyStartMenu)
  331.             PostMessage(hwndClock, CLOCKM_REFRESHSTARTMENU, 0, 0);
  332.         if(g_bApplyTip)
  333.             PostMessage(hwndClock, CLOCKM_REFRESHTOOLTIP, 0, 0);
  334.     }
  335.     g_bApplyClock = FALSE;
  336.     g_bApplyTaskbar = FALSE;
  337.     g_bApplyStartMenu = FALSE;
  338.     g_bApplyTip = FALSE;
  339.     
  340.     if(g_bApplyMain)
  341.     {
  342.         HWND hwnd = GetTClockMainWindow();
  343.         if(hwnd) PostMessage(hwnd, TCM_RELOADSETTING, 0, 0);
  344.         g_bApplyMain = FALSE;
  345.     }
  346.     
  347.     EnableDlgItem(hDlg, IDC_APPLY, FALSE);
  348. }
  349.  
  350. /*-------------------------------------------
  351.   "Help" button
  352. ---------------------------------------------*/
  353. void OnHelp(HWND hDlg)
  354. {
  355.     NMHDR lp;
  356.     int nPage;
  357.     
  358.     if(0 <= m_lastTreeItem && m_lastTreeItem < MAX_TREEITEM)
  359.     {
  360.         nPage = g_treeItem[m_lastTreeItem].nPage;
  361.         lp.code = PSN_HELP;
  362.         if(g_dlgPage[nPage].hDlg)
  363.             SendMessage(g_dlgPage[nPage].hDlg, WM_NOTIFY, 0, (LPARAM)&lp);
  364.     }
  365. }
  366.  
  367. /*------------------------------------------------
  368.    when tree view item is clicked,
  369.    create/show a child dialog.
  370. --------------------------------------------------*/
  371. void OnTVChanged(HWND hDlg, int nItem)
  372. {
  373.     int i, nPage;
  374.     BOOL bexist = FALSE;
  375.     HWND hDlgPage;
  376.     RECT rc;
  377.     POINT pt;
  378.     
  379.     if(nItem >= MAX_TREEITEM) return;
  380.     
  381.     m_lastTreeItem = nItem;
  382.     
  383.     nPage = g_treeItem[nItem].nPage;
  384.     
  385.     for(i = 0; i < MAX_PAGE; i++)
  386.     {
  387.         hDlgPage = g_dlgPage[i].hDlg;
  388.         if(hDlgPage)
  389.         {
  390.             if(i == nPage)
  391.             {
  392.                 ShowWindow(hDlgPage, SW_SHOW);
  393.                 bexist = TRUE;
  394.             }
  395.             else
  396.                 ShowWindow(hDlgPage, SW_HIDE);
  397.         }
  398.     }
  399.     
  400.     if(bexist) return;
  401.     
  402.     hDlgPage = CreateDialog(g_hInst,
  403.         MAKEINTRESOURCE(g_dlgPage[nPage].idDlg),
  404.         hDlg, g_dlgPage[nPage].dlgproc);
  405.     g_dlgPage[nPage].hDlg = hDlgPage;
  406.     
  407.     GetWindowRect(GetDlgItem(hDlg, IDC_DUMMY), &rc);
  408.     pt.x = rc.left; pt.y = rc.top;
  409.     ScreenToClient(hDlg, &pt);
  410.     SetWindowPos(hDlgPage, GetDlgItem(hDlg, IDC_TREE),
  411.         pt.x, pt.y, rc.right-rc.left, rc.bottom-rc.top,
  412.         SWP_SHOWWINDOW);
  413. }
  414.  
  415. /*-------------------------------------------
  416.   set items to left tree view
  417. ---------------------------------------------*/
  418. void InitTreeView(HWND hDlg)
  419. {
  420.     HWND hTree;
  421.     TV_INSERTSTRUCT tv;
  422.     HTREEITEM hTreeItem[MAX_TREEITEM];
  423.     int i;
  424.     
  425.     hTree = GetDlgItem(hDlg, IDC_TREE);
  426.     memset(&tv, 0, sizeof(TV_INSERTSTRUCT));
  427.     
  428.     tv.hInsertAfter = TVI_LAST;
  429.     tv.item.mask = TVIF_TEXT | TVIF_STATE | TVIF_PARAM;
  430.     tv.item.state = TVIS_EXPANDED;
  431.     tv.item.stateMask = TVIS_EXPANDED;
  432.     
  433.     for(i = 0; i < MAX_TREEITEM; i++)
  434.     {
  435.         int nParent = g_treeItem[i].nParent;
  436.         
  437.         tv.item.lParam = i;
  438.         if(nParent < 0) tv.hParent = TVI_ROOT;
  439.         else tv.hParent = hTreeItem[nParent];
  440.         tv.item.pszText = 
  441.             MyString(g_treeItem[i].idStr, g_treeItem[i].entry);
  442.         hTreeItem[i] = TreeView_InsertItem(hTree, &tv);
  443.     }
  444.     
  445.     m_lastTreeItem = GetMyRegLong("", "LastTreeItem", 0);
  446.     if(m_lastTreeItem >= MAX_TREEITEM) m_lastTreeItem = 0;
  447.     TreeView_SelectItem(hTree, hTreeItem[m_lastTreeItem]);
  448. }
  449.  
  450. /*-------------------------------------------
  451.   Show "TClock Help"
  452. ---------------------------------------------*/
  453. void MyHelp(HWND hwnd, const char *section)
  454. {
  455.     char helpurl[MAX_PATH], title[MAX_PATH];
  456.     
  457.     if(!g_langfile[0]) return;
  458.     
  459.     GetMyRegStr(NULL, "HelpURL", helpurl, MAX_PATH, "");
  460.     if(helpurl[0] == 0)
  461.     {
  462.         if(GetPrivateProfileString("Main", "HelpURL", "", helpurl,
  463.             MAX_PATH, g_langfile) == 0) return;
  464.     }
  465.     
  466.     if(GetPrivateProfileString(section, "HelpURL", "", title,
  467.             MAX_PATH, g_langfile) == 0) return;
  468.     
  469.     if(strlen(helpurl) > 0 && helpurl[ strlen(helpurl) - 1 ] != '/')
  470.         del_title(helpurl);
  471.     add_title(helpurl, title);
  472.     
  473.     ShellExecute(hwnd, NULL, helpurl, NULL, "", SW_SHOW);
  474. }
  475.  
  476. /*-------------------------------------------
  477.   called in PlayFile function
  478. ---------------------------------------------*/
  479. BOOL ExecCommandString(HWND hwnd, const char* command)
  480. {
  481.     /* ExecFile(hwnd, command); */
  482.     SendStringToOther(GetTClockMainWindow(), hwnd, command,
  483.         COPYDATA_EXEC);
  484.     
  485.     return FALSE;
  486. }
  487.